package com.shopping_back.util;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.JWTValidator;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

@Component
@ComponentScan
public class JwtUtils {
    @Value("${jwt.secret}")
    private String secretKey;

    @Value("${jwt.token-header:Authorization}")
    private String tokenHeader;

    @Value("${jwt.token-prefix:Bearer }")
    private String tokenPrefix;

    // 工具方法改为实例方法，或通过Spring Bean调用
    public Long getCurrentUserId(HttpServletRequest request) {
        String token = resolveToken(request);
        return parseUserId(token);
    }
    /**
     * 从请求头中解析出Token
     */
    private String resolveToken(HttpServletRequest request) {
        String bearerToken = request.getHeader(tokenHeader);
        System.out.println("获取到的" + tokenHeader + "头: " + bearerToken);
        // 检查Token是否存在
        if (bearerToken == null || bearerToken.trim().isEmpty()) {
            throw new RuntimeException("请求头中未包含" + tokenHeader + "信息");
        }
        // 检查Token前缀
        if (!bearerToken.startsWith(tokenPrefix)) {
            throw new RuntimeException("Token格式错误，需以" + tokenPrefix + "开头");
        }
        // 提取实际Token内容
        String token = bearerToken.substring(tokenPrefix.length()).trim();
        // 检查Token是否为空
        if (token.isEmpty()) {
            throw new RuntimeException("Token内容为空");
        }
        // 检查JWT格式（三段式结构）
        if (token.split("\\.").length != 3) {
            throw new RuntimeException("无效的Token格式，应为三段式结构");
        }
        return token;
    }
    /**
     * 从Token中解析出用户ID
     */
    private Long parseUserId(String token) {
        try {
            // 验证 Token 并解析
            JWT jwt = JWTUtil.parseToken(token);
            if (!jwt.setKey(secretKey.getBytes()).verify()) {
                throw new RuntimeException("Token签名验证失败");
            }

            // 步骤1：获取 sub 字段中的 JSON 字符串（用户信息存于此）
            String subJson = jwt.getPayload("sub").toString(); // 对应 payload 中的 "sub" 字段
            if (subJson == null || subJson.isEmpty()) {
                throw new RuntimeException("Token中未包含用户信息（sub字段为空）");
            }

            // 步骤2：解析 JSON 字符串，提取 userId
            cn.hutool.json.JSONObject userJson = new cn.hutool.json.JSONObject(subJson);
            Object userIdObj = userJson.get("userId"); // 从嵌套JSON中获取userId
            if (userIdObj == null) {
                throw new RuntimeException("Token的sub字段中未包含userId信息");
            }

            // 步骤3：转换为Long类型（保持原转换逻辑）
            if (userIdObj instanceof Integer) {
                return ((Integer) userIdObj).longValue();
            } else if (userIdObj instanceof Long) {
                return (Long) userIdObj;
            } else if (userIdObj instanceof String) {
                return Long.parseLong((String) userIdObj);
            } else {
                throw new RuntimeException("userId格式不支持: " + userIdObj.getClass().getName());
            }

        } catch (Exception e) {
            throw new RuntimeException("解析用户ID失败: " + e.getMessage());
        }
    }
}